package xing.design.pattern.behavioral.Memento.sample3_andCommandPattern.editor.command.edit;

import xing.design.pattern.behavioral.Memento.sample3_andCommandPattern.editor.Editor;
import xing.design.pattern.behavioral.Memento.sample3_andCommandPattern.editor.History;
import xing.design.pattern.behavioral.Memento.sample3_andCommandPattern.editor.command.ICommand;

/**
 * EditCommand 类，。各种编辑命令的父类。
 *
 * 算是使用了模板方法模式。
 *
 * @author xing
 * @date 2023/2/10 14:58:35
 */
public abstract class EditCommand implements ICommand {

    /**
     * 被外部调用的方法，
     * <p>
     * 显示需求 Editor 对象，
     * <p>
     * （如果不显示表示，在此之前需要调用 setEditor 设置了 Editor （这点我可以在 Editor 类调用 execute() 里做了设置）
     * ，。但是可能会造成外部对 Command.execute() 的错误执行。因为不知道要先 setEditor()）
     */
    public void execute(Editor editor) {
        // assert editor != null;
        doExecute(editor);
        updateHistory(editor);
    }

    /**
     * 实际要重写的执行方法
     */
    protected abstract void doExecute(Editor editor);

    protected void updateHistory(Editor editor) {
        History history = editor.getHistory();
        history.undoPush(this, editor.createMemento());
    }
}
